package com.wtwd.campus.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.wtwd.campus.entity.DeviceFlag;
import com.wtwd.campus.entity.Plmn;
import com.wtwd.campus.entity.SysUser;
import com.wtwd.campus.model.dto.*;
import com.wtwd.campus.model.vo.DeviceFlagVo;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 服务类
 * </p>
 * 锁指令处理统一
 * 以后面发送的指令为准
 * 统一处理
 *
 * @author mjy
 * @since 2022-12-15
 */
public interface DeviceFlagService extends IService<DeviceFlag> {

    /**
     * 修改app安装的总开关
     *
     * @param deviceId
     * @param flag
     * @return
     */
    boolean setAppInstallationFlag(Integer deviceId, Integer flag);

    /**
     * 查询设备安装开关
     *
     * @param deviceId
     * @return
     */
    DeviceFlag queryDeviceSwitch(Integer deviceId);

    /**
     * 更新锁卡信息
     *
     * @param deviceId
     * @param flag
     * @param pin
     * @param iccid
     * @return
     */
    boolean updateLockCardInfo(Integer deviceId, int flag, String pin, String iccid);

    /**
     * 更新锁机信息
     *
     * @param deviceId
     * @param flag
     * @param iccid
     * @return
     */
    boolean updateLockDeviceInfo(Integer deviceId, int flag, String iccid);

    /**
     * 更新锁网信息
     *
     * @param deviceId
     * @param flag
     * @param plmns
     * @return
     */
    boolean updateLockNetInfo(Integer deviceId, int flag, List<Plmn> plmns);

    /**
     * 根据组织code，锁卡情况查询设备
     * <p>
     * 查询结果情况,打开包括待打开,关闭包括待关闭
     * <p>
     * 如果执行指令执行失败,则归于待打开类，重新设置
     *
     * @param orgCode
     * @param flag
     * @return
     */
    List<DeviceFlagVo> getDeviceLockCardInfoByOrgCode(String orgCode, Integer flag);

    /**
     * 同设备锁卡统一
     *
     * @param orgCode
     * @param flag
     * @return
     */
    List<DeviceFlagVo> getDeviceLockDeviceInfoByOrgCode(String orgCode, Integer flag);

    /**
     * 同设备锁网统一
     *
     * @param orgCode
     * @param flag
     * @return
     */
    List<DeviceFlagVo> getDeviceLockNetInfoByOrgCode(String orgCode, Integer flag);

    /**
     * 批量锁卡
     * 1.锁卡时批量创建或者更新开关表数据
     * 2.批量发送锁卡指令
     *
     * @param lockDtos
     * @return
     */
    boolean bathLockCard(List<LockDto> lockDtos, SysUser sysUser);

    /**
     * 批量创建或者更新锁卡情况
     *
     * @param lockDtos
     * @return
     */
    boolean bathCreateOrUpdateLockCardByLockDtos(List<LockDto> lockDtos);


    /**
     * 批量获取设备是否上线
     * <p>
     * 此处直接map返回
     * 列
     * key:imei
     * value:true or false boolean 类型
     * <p>
     * 此方法保证imeis不为空的情况,一定会有数据返回
     */
    Map<String, Boolean> bathGetDeviceOnline(List<String> imeis);


    /**
     * 发送锁卡指令
     *
     * @param imei
     * @param flag
     * @param sysUser
     * @return
     */
    boolean sendLockCard(String imei, int flag, String pin, boolean online, SysUser sysUser);

    /**
     * 发送锁机指令
     *
     * @param imei
     * @param flag
     * @param online
     * @param sysUser
     * @return
     */
    boolean sendLockDevice(String imei, int flag, String iccid, boolean online, SysUser sysUser);

    /**
     * 发送锁网指令
     *
     * @param imei
     * @param flag
     * @param online
     * @param sysUser
     * @return
     */
    boolean sendLockNet(String imei, int flag, List<Plmn> plmns, boolean online, SysUser sysUser);

    /**
     * 取消缓存重发
     *
     * @param imei
     * @param cmdPrefix
     * @return
     */
    boolean deleteCacheCmd(String imei, String cmdPrefix);

    /**
     * 批量锁设备
     *
     * @param lockDtos
     * @param sysUser
     * @return
     */
    boolean bathLockDevice(List<BathLockDevice> lockDtos, SysUser sysUser);

    /**
     * 批量插入或者更新锁设备
     *
     * @param lockDtos
     * @return
     */
    boolean bathCreateOrUpdateLockDeviceByLockDtos(List<BathLockDevice> lockDtos);

    /**
     * 通过plmn组获取mcc,mnc
     *
     * @param plmns
     * @param split
     * @return
     */
    List<Plmn> MccMncByPlmns(String plmns, String split);

    /**
     * 批量锁网
     *
     * @param lockDtos
     * @param plmnList
     * @param sysUser
     * @return
     */
    boolean bathLockNet(List<BathLockNet> lockDtos, List<Plmn> plmnList, SysUser sysUser);

    /**
     * 批量创建或者更新锁网
     *
     * @param lockDtos
     * @param plmns
     * @return
     */
    boolean bathCreateOrUpdateLockNetDtos(List<BathLockNet> lockDtos, String plmns);

    /**
     * 回滚锁卡
     * 待状态不可操作的的前提下
     * 待打开代表之前关闭
     * 否则同理
     *
     * @param deviceId
     * @return
     */
    boolean lockCardRollBack(Integer deviceId);

    /**
     * 回滚锁设备
     *
     * @param deviceId
     * @return
     */
    boolean lockDeviceRollBack(Integer deviceId);

    /**
     * 回滚锁网
     *
     * @param deviceId
     * @return
     */
    boolean lockNetRollBack(Integer deviceId);

    /**
     * 处理锁卡数据
     *
     * @param all(锁住客户所有设备 1,解锁所有设备 2,为空时根据设备集合)
     * @param deviceIds(此集合类包含所有需要锁住的设备)
     * @param orgCode(需要锁住的客户的组织code)
     * @return
     */
    BathLockDto dealLockCardData(Integer all, List<Integer> deviceIds, String orgCode);

}
